package com.xzr.demo.common;

import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;

import java.io.*;

/**
 * 二进制序列化
 * 任意一个 java对象 都可以 通过下述逻辑进行 序列化 和反序列化
 * 要求：实体类需要实现一个  Serializable 接口
 * @Author：徐志荣
 * @Date：2023/8/10 上午 9:53
 */
public class BinaryTool {

    /**
    * 把一个对象序列化成一个字节数组
    * @param object
    * @return
    */
    public static byte[] toBytes(Object object) throws IOException {
        //这个流对象 相当于 一个变长的 字节数组
        // 就可以把 Object 序列化的数据给逐渐的写到  byteArrayOutputStream ，再统一转成 byte[]
       try( ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()){
           try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)){
                //此处的 writeObject 就会把该对象进行序列化，生成的二进制字节数据
               //就会写入到：objectOutputStream 中，
               //由于objectOutputStream 又是关联到了  ByteArrayOutputStream ，最后写 ByteArrayOutputStream里面了
               objectOutputStream.writeObject(object);
           }
           //byteArrayOutputStream 中国持有的二进制数据取出来，转成 byte[]
           return byteArrayOutputStream.toByteArray();

       }



    }

    /**
    * 把一个字节数组，反序列化成一个对象
    * @param data
    * @return
    */
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try( ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)){
            try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)){
                object= objectInputStream.readObject();
            }
        }
        return object;
    }

}
